#pragma once

#define common_args_length_compile(...) (sizeof((int[]){__VA_ARGS__}) / sizeof(int))

#define common_args_length(...) \
  __args_length_calculate (__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)

#define common_get_n_element(...) __get_element (__VA_ARGS__)

#define common_args_get_last(...) \
  common_get_n_element (common_args_length (__VA_ARGS__), __VA_ARGS__)

#define common_args_get_first(first, ...) first

#define __args_length_calculate(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, ...) \
  _10

#define __get_element_1(argument) argument

#define __get_element_2(argument, ...) __get_element_1 (__VA_ARGS__)

#define __get_element_3(argument, ...) __get_element_2 (__VA_ARGS__)

#define __get_element_4(argument, ...) __get_element_3 (__VA_ARGS__)

#define __get_element_5(argument, ...) __get_element_4 (__VA_ARGS__)

#define __get_element_6(argument, ...) __get_element_5 (__VA_ARGS__)

#define __get_element_7(argument, ...) __get_element_6 (__VA_ARGS__)

#define __get_element_8(argument, ...) __get_element_7 (__VA_ARGS__)

#define __get_element_9(argument, ...) __get_element_8 (__VA_ARGS__)

#define __get_element_10(argument, ...) __get_element_9 (__VA_ARGS__)

#define __get_element(n, ...) __get_element_##n (__VA_ARGS__)

#ifdef common_namespace

#define args_get_first(...) common_args_get_first(__VA_ARGS__)

#define args_get_last(...) common_args_get_last(__VA_ARGS__)

#define args_length(...) common_args_length (__VA_ARGS__)

#define args_length_compile(...) common_args_length_compile (__VA_ARGS__)

#endif
